查看原文
其他

谈谈HashMap、Hashtable和ConcurrenHashMap

小秋 苦逼的码农 2019-01-22

坚持 再坚持 总会更加幸运

今天,我们来谈谈HashMap, Hashtable和ConcurrentHashMap在使用上的一些区别。

如果你还不知道HashMap的工作原理,建议看看

HashMap的存取原理你知道多少

先谈谈HashMap和Hashtable的区别

它们两个在工作原理上几乎是一样的。它们两个的区别主要体现在:对键值对的要求、线程的安全性,迭代器的选择以及速度上。

1.对键值对的要求

在进行集合的put(key, value)操作时,对于HashMap来说,它允许key和value的值可以是null。但是,Hashtable则对key和value有要求,不允许key和value为null

2.线程的安全上

HashMap是非同步的(synchronized),这也意味着,HashMap在进行插入、删除等操作的时候,是线程不安全的,如果自己没有在程序上对HashMap进行同步的处理,则不能让多个线程共享一个变量。如下图(没有加同步锁)


但,Hashtable是线程安全的,这也意味着可以在多个线程的环境上,共享一个变量。不过,需要提出的是,Hashtable是在每个方法前面加一个锁的。如下图

使用迭代器上的区别

HashMap的迭代器(Iterator)是使用fail-fast机制的(快速失败机制),而Hashtable的迭代器(enumerator)使用的是fail-safe机制(快速安全)。如果不知道fail-fast与fail-safe,建议看看我的另一片文章:

谈谈fail-fast与fail-safe

处理速度上的区别

居然Hashtable在线程安全方面要比HashMap强,那么在其他的方面自然要比它弱。由于Hashtable是线程安全的,同步的,那么在单线程的情况下,它的处理速度是要比HashMap慢的。

但是,就算在多线程环境下,我们也不使用Hashtable,Hashtable的同步锁是加在方法名前面的,意味着它把整个方法的代码都给锁的,所以在处理速度上是特别慢的。所以在多线程的环境下,我们优先使用另一个集合:ConcurrentHashMap,这个集合在工作原理上几乎和前面两个一样,但它是线程安全的,并且它不像Hashtable那样,把整个方法都给加锁,而是在方法里面的关键代码上加同步锁,如图:

所以,它在处理速度上比Hashtable要快,但比HashMap慢,可以说,ConcurrentHashMap是HashMap和Hashtable的折中方案。


下面解释一下什么是同步(synchronization):

假如我们在一个方法前面加了同步锁,那么在多线程的环境下,如果有一个线程1正在执行这个方法里面的代码(也就是所,这个线程获得了同步锁)。那么其他线程则不能进去执行这个方法里面的代码,直到线程1把这个方法里面的代码全部执行完,并且退出这个方法(释放同步锁),那么其他的线程在获得同步锁之后才能执行这个方法。

推荐阅读:
HashMap的存取原理你知道多少
谈谈fail-fast与fail-safe

感谢你的阅读,希望对你有所帮助

关注我的公众号:苦逼的码农

每天推送技术文章,各种资源以及

每日一题 有关面试的算法题


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存